package br.com.ufc.view;

import br.com.ufc.contoller.AgendaArray;
import br.com.ufc.contoller.AgendaDataBase;
import br.com.ufc.contoller.AgendaHash;
import br.com.ufc.model.TarefaTO;
import br.com.ufc.contoller.AgendaVector;
import br.com.ufc.contoller.Agendavel;
import java.util.ResourceBundle;
import java.util.Scanner;

import br.com.ufc.exception.BusinessException;
import br.com.ufc.exception.IntegrationException;
import br.com.ufc.model.Tarefa;
import br.com.ufc.model.TarefaDesenvolvimentoAuto;

public class InterAgenda {

    private static Scanner console = new Scanner(System.in);
    private static Agendavel agenda;

    public static void main(String[] args) throws InterruptedException {
        ResourceBundle prop = ResourceBundle.getBundle("br.com.ufc.resources.application");

        // Agendavel agenda;
        // 1 - HASH, 2 - VECTOR, 3 - ARRAY
        switch (new Integer(prop.getString("TIPO_AGENDA"))) {
            case 1:
                agenda = new AgendaHash();
                break;
            case 2:
                agenda = new AgendaVector();
            case 3:
                agenda = new AgendaArray();
                break;
            default:
                agenda = new AgendaDataBase();
                break;
        }

        System.out.println("Informe o tamando do array");

        Integer tamArray = console.nextInt();
        agenda.setTarefas(tamArray);

        Integer opcao = 1;
        while (opcao.intValue() != 10) {

            opcao = montarNovoMenu(console);
            switch (opcao.intValue()) {
                case 1:
                    cadastrarTarefa();
                    break;
                case 2:
                    removerTarefa();
                    break;
                case 3:
                    consultarTarefa();
                    break;
                case 4:
                    iniciarTarefa();
                    break;
                case 5:
                    encerrarTarefa();
                    break;
                case 6:
                    // agenda.imprimirTarefas();
                    listarTarefas();
                    break;
                case 7:
                    incrementarImportanciaTarefa();
                    break;
                case 8:
                    cancelarTarefa();
                    break;
                case 9:
                    reiniciarTarefa();
                    break;
                case 10:
                    System.out.println("Aplicação encerrada!");
                    break;
                default:
                    System.out.println("INFO: Opção inválida! A aplicação será encerrada!");
                    opcao = 10;
                    break;
            }

        }
    }

    private static Integer montarNovoMenu(Scanner console) {
        System.out.println("1 - Cadastrar uma tarefa");
        System.out.println("2 - Remover uma tarefa");
        System.out.println("3 - Consultar");
        System.out.println("4 - Iniciar Tarefa");
        System.out.println("5 - Encerrar Tarefa");
        System.out.println("6 - Listar as tarefas");
        System.out.println("7 - Incrementar a importância de uma tarefa");
        System.out.println("8 - Cancelar tarefa");
        System.out.println("9 - Reiniciar tarefa");
        System.out.println("10 - Sair");

        System.out.println("Informe a opção desejada");
        String aux = console.next();
        return new Integer(aux);
    }

    private static void cadastrarTarefa() {
        // Tarefa t = new Tarefa();
        Tarefa t = new TarefaDesenvolvimentoAuto();

        // descricao
        System.out.println("S - Informe a descricao da tarefa");
        t.setDescricao(console.next());

        // data
        System.out.println("S - Informe a data da tarefa");
        t.setData(console.next());

        // hora de inicio
        System.out.println("S - Informe a hora de inicio da tarefa");
        t.setHoraInicio(console.next());

        // duracao
        System.out.println("I - Informe a duração da tarefa");
        String aux = console.next();
        t.setDuracao(new Integer(aux));

        // local
        System.out.println("S - Informe o local da tarefa");
        t.setLocal(console.next());

        // importancia
        System.out.println("I - Informe a importancia da tarefa");
        aux = console.next();
        t.setImportancia(new Integer(aux));

        // urgencia
        System.out.println("I - Informe a urgencia da tarefa");
        aux = console.next();
        t.setUrgencia(new Integer(aux));

        // valorHora
        System.out.println("I - Informe o valor da hora da tarefa");
        aux = console.next();
        t.setValorHora(new Double(aux));
        agenda.cadastrarTarefa(t);
    }

    private static void removerTarefa() {
        System.out.println("Informe o código da tarefa que você deseja remover:");
        String aux = console.next();
        Long codigo = new Long(aux);
        Tarefa t = null;
        try {
            t = agenda.consultarTarefa(codigo);
        } catch (IntegrationException i) {
            System.out.println("ERRO - REMOVER TAREFA: " + i.getMessage());
        } catch (Exception e) {
            System.out.println("ERRO - REMOVER TAREFA: " + e.getMessage());
        }
        if (agenda.removerTarefa(t)) {
            System.out.println("INFO: Tarefa removida com sucesso!");
            ;
        } else {
            System.out.println("FAIL: Falha ao encerrar tarefa!");
        }
    }

    private static void consultarTarefa() {
        System.out.println("Informe o código da tarefa");
        String aux = console.next();
        Long codigo = new Long(aux);
        Tarefa t = null;
        try {
            t = agenda.consultarTarefa(codigo);
        } catch (IntegrationException i) {
            System.out.println("ERRO - CONSULTAR TAREFA: " + i.getMessage());
        } catch (Exception e) {
            System.out.println("ERRO - CONSULTAR TAREFA: " + e.getMessage());
        }
        imprimirTarefa(t);
    }

    private static void imprimirTarefa(Tarefa t) {
        if (t != null) {
            System.out.println("========");
            System.out.println("Código: " + t.getCodigo());
            System.out.println("Descrição: " + t.getDescricao());
            System.out.println("Data: " + t.getData());
            System.out.println("Hora de início: " + t.getHoraInicio());
            System.out.println("Duracao: " + t.getDuracao());
            System.out.println("Valor cobrado: " + t.getValorCobrado());
            System.out.println("Importância: " + t.getImportancia());
            System.out.println("Status: " + t.getStatus());
        }
    }

    private static void listarTarefas() {
        TarefaTO aTO = agenda.listarTarefas();
        for (Tarefa t : aTO.getListaTarefas()) {
            if (t != null) {
                System.out.println("========");
                System.out.println("Código: " + t.getCodigo());
                System.out.println("Descrição: " + t.getDescricao());
                System.out.println("Data: " + t.getData());
                System.out.println("Hora de início: " + t.getHoraInicio());
                System.out.println("Duracao: " + t.getDuracao());
                System.out.println("Valor cobrado: " + t.getValorCobrado());
                System.out.println("Importância: " + t.getImportancia());
                System.out.println("Status: " + t.getStatus());
            }
        }
    }

    private static void iniciarTarefa() {
        System.out.println("Informe o código da tarefa");
        String aux = console.next();
        Long codigo = new Long(aux);
        Tarefa t = null;
        try {
            t = agenda.consultarTarefa(codigo);
        } catch (IntegrationException i) {
            System.out.println("ERRO - INICIAR TAREFA" + i.getMessage());
        } catch (Exception e) {
            System.out.println("ERRO - INICIAR TAREFA: " + e.getMessage());
        }
        if (agenda.iniciarTarefa(t)) {
            System.out.println("INFO: Tarefa iniciada com sucesso!");
        } else {
            System.out.println("FAIL: Falha ao iniciar tarefa!");
        }
    }

    private static void encerrarTarefa() {
        System.out.println("Informe o código da tarefa");
        String aux1 = console.next();
        Long codigo = new Long(aux1);
        System.out.println("Informe o valor cobrado pela tarefa");
        Double valorCobrado = new Double(console.next());
        Tarefa t = null;
        try {
            t = agenda.consultarTarefa(codigo);
        } catch (IntegrationException i) {
            System.out.println("ERRO - ENCERRAR TAREFA: " + i.getMessage());
        } catch (Exception e) {
            System.out.println("ERRO - ENCERRAR TAREFA: " + e.getMessage());
        }
        if (agenda.encerrarTarefa(t, valorCobrado)) {
            System.out.println("INFO: Tarefa encerrada com sucesso!");
        } else {
            System.out.println("FAIL: Falha ao encerrar tarefa!");
        }
    }

    private static void incrementarImportanciaTarefa() {
        System.out.println("Informe o código da tarefa");
        String aux = console.next();
        Long codigo = new Long(aux);
        Tarefa t = null;
        try {
            t = agenda.consultarTarefa(codigo);
        } catch (IntegrationException i) {
            System.out.println("ERRO - INCREMENTAR TAREFA" + i.getMessage());
        } catch (Exception e) {
            System.out.println("ERRO - INCREMENTAR TAREFA: " + e.getMessage());
        }
        agenda.incrementarImportancia(t);
    }

    private static void cancelarTarefa() {
        System.out.println("Informe o código da tarefa");
        String aux = console.next();
        Long codigo = new Long(aux);
        Tarefa t = null;
        try {
            t = agenda.consultarTarefa(codigo);
        } catch (IntegrationException i) {
            System.out.println("ERRO - INCREMENTAR TAREFA" + i.getMessage());
        } catch (Exception e) {
            System.out.println("ERRO - INCREMENTAR TAREFA: " + e.getMessage());
        }
        if (agenda.cancelarTarefa(t)) {
            System.out.println("INFO: Tarefa cancelada com sucesso!");
        } else {
            System.out.println("FAIL: Falha ao cancelar tarefa!");
        }
    }

    private static void reiniciarTarefa() {
        System.out.println("Informe o código da tarefa");
        String aux = console.next();
        Long codigo = new Long(aux);
        Tarefa t = null;
        try {
            t = agenda.consultarTarefa(codigo);
        } catch (IntegrationException i) {
            System.out.println("ERRO - INCREMENTAR TAREFA" + i.getMessage());
        } catch (Exception e) {
            System.out.println("ERRO - INCREMENTAR TAREFA: " + e.getMessage());
        }
        try {
            if (agenda.reiniciarTarefa(t)) {
                System.out.println("INFO: Tarefa reiniciada com sucesso!");
            } else {
                System.out.println("FAIL: Falha ao reiniciar tarefa!");
            }
        } catch (BusinessException bu) {
            System.out.println("ERRO - INCREMENTAR TAREFA" + bu.getMessage());
        } catch (Exception e) {
            System.out.println("ERRO - INCREMENTAR TAREFA: " + e.getMessage());
        }
    }
}
